package acme.bloodtime.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import modelo.ICiudadDO;
import modelo.ICiudadDistanciaDAO;
import modelo.ICiudadDistanciaDO;

import dao.api.DataObject;
import dao.api.Reference;

/**
 * 
 * @author Eduardo D. Sandoval V.
 * 
 */
public class CiudadDistanciaDAO extends BloodTimeBaseDAO implements ICiudadDistanciaDAO {

	public CiudadDistanciaDAO() {
		// empty
	}

	public void createTable() throws SQLException {
		StringBuffer strbuf;

		// ----------------------------------------

		dropTable();

		// ----------------------------------------

		CiudadDAO ciudadDAO = new CiudadDAO();
		ciudadDAO.init(connectionBean);

		strbuf = new StringBuffer();

		strbuf.append("CREATE TABLE ");
		strbuf.append(getTableName());
		strbuf.append(" (");
		strbuf.append(CiudadDistanciaDO.ID);
		strbuf.append(" SERIAL PRIMARY KEY, ");
		strbuf.append(CiudadDistanciaDO.DISTANCIA);
		strbuf.append(" NUMERIC,    ");
		strbuf.append(CiudadDistanciaDO.CIUDAD_DER_ID);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(ciudadDAO.getTableName());
		strbuf.append(", ");
		strbuf.append(CiudadDistanciaDO.CIUDAD_IZQ_ID);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(ciudadDAO.getTableName());
		strbuf.append(")");

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

	}

	// --------------------------------------------------------------------------------

	@Override
	public void insert(DataObject dataObject) throws SQLException {
		checkCache(dataObject, CHECK_INSERT);
		checkClass(dataObject, CiudadDistanciaDO.class, CHECK_INSERT);

		CiudadDistanciaDO ciudadDistanciaDO = (CiudadDistanciaDO) dataObject;

		ciudadDistanciaDO.setId(getNextId());

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("INSERT INTO ");
		strbuf.append(getTableName());
		strbuf.append(" VALUES (");
		strbuf.append(ciudadDistanciaDO.getId());
		strbuf.append(", ");
		strbuf.append(ciudadDistanciaDO.getDistancia());
		strbuf.append(", ");

		Reference<ICiudadDO> ciudadDerRef = ciudadDistanciaDO.getCiudadDerId();
		ciudadDerRef.checkInsert();

		strbuf.append(ciudadDerRef.getIdAsString());
		strbuf.append(", ");

		Reference<ICiudadDO> ciudadIzqRef = ciudadDistanciaDO.getCiudadIzqId();
		ciudadIzqRef.checkInsert();

		strbuf.append(ciudadIzqRef.getIdAsString());
		strbuf.append(")");

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

		dtaSession.add(dataObject);
	}

	// --------------------------------------------------------------------------------

	@Override
	public void update(DataObject dataObject) throws SQLException {
		checkCache(dataObject, CHECK_UPDATE);
		checkClass(dataObject, CiudadDistanciaDO.class, CHECK_UPDATE);

		CiudadDistanciaDO ciudadDistanciaDO = (CiudadDistanciaDO) dataObject;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("UPDATE ");
		strbuf.append(getTableName());
		strbuf.append(" SET ");

		strbuf.append(CiudadDistanciaDO.DISTANCIA);
		strbuf.append(" = ");
		strbuf.append(ciudadDistanciaDO.getDistancia());

		strbuf.append(", ");

		strbuf.append(CiudadDistanciaDO.CIUDAD_IZQ_ID);
		strbuf.append(" = ");

		Reference<ICiudadDO> ciudadIzqIdRef = ciudadDistanciaDO.getCiudadIzqId();
		ciudadIzqIdRef.checkUpdate();
		strbuf.append(ciudadIzqIdRef.getIdAsString());

		strbuf.append(", ");

		strbuf.append(CiudadDistanciaDO.CIUDAD_DER_ID);
		strbuf.append(" = ");

		Reference<ICiudadDO> ciudadDerIdRef = ciudadDistanciaDO.getCiudadDerId();
		ciudadDerIdRef.checkUpdate();
		strbuf.append(ciudadDerIdRef.getIdAsString());

		strbuf.append(" WHERE ");
		strbuf.append(CiudadDO.ID);
		strbuf.append(" = ");
		strbuf.append(ciudadDistanciaDO.getId());

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());
	}

	// --------------------------------------------------------------------------------

	@Override
	public void delete(DataObject ciudadDistanciaDO) throws SQLException {
		internalDelete(ciudadDistanciaDO, CiudadDistanciaDO.class);
	}

	// --------------------------------------------------------------------------------

	protected CiudadDistanciaDO resultSetToDO(ResultSet rs) throws SQLException {
		CiudadDistanciaDO ret = //
		(CiudadDistanciaDO) dtaSession.getDtaByKey( //
				CiudadDistanciaDO.class, rs.getInt(CiudadDistanciaDO.ID));

		if (ret != null) {
			return ret;
		}

		ret = new CiudadDistanciaDO();

		ret.setId/*     */(rs.getInt(CiudadDistanciaDO.ID));
		ret.setDistancia/*   */(rs.getFloat(CiudadDistanciaDO.DISTANCIA));

		Reference<ICiudadDO> ref1 = new Reference<ICiudadDO>();
		ref1.setRefIdent(rs.getInt(CiudadDistanciaDO.CIUDAD_IZQ_ID));

		ret.setCiudadIzqId(ref1);

		Reference<ICiudadDO> ref2 = new Reference<ICiudadDO>();
		ref2.setRefIdent(rs.getInt(CiudadDistanciaDO.CIUDAD_DER_ID));

		ret.setCiudadDerId(ref2);

		return (CiudadDistanciaDO) dtaSession.add(ret);
	}

	public void loadCiudadIzq(ICiudadDistanciaDO ciudadDistanciaDO)
			throws SQLException {
		checkClass(ciudadDistanciaDO, CiudadDistanciaDO.class, CHECK_UPDATE);

		CiudadDAO ciudadDAO = new CiudadDAO();
		ciudadDAO.init(connectionBean);

		Reference<ICiudadDO> ref = ciudadDistanciaDO.getCiudadIzqId();

		// ----------------------------------------
		// If ident == 0 there is nothing to do
		// ----------------------------------------

		if (ref.getRefIdent() == 0) {
			return;
		}

		CiudadDO ciudadDO = //
		(CiudadDO) ciudadDAO.loadById(ref.getRefIdent());

		ref.setRefValue(ciudadDO);
	}

	public void loadCiudadDer(ICiudadDistanciaDO ciudadDistanciaDO)
			throws SQLException {
		checkClass(ciudadDistanciaDO, CiudadDistanciaDO.class, CHECK_UPDATE);

		CiudadDAO ciudadDAO = new CiudadDAO();
		ciudadDAO.init(connectionBean);

		Reference<ICiudadDO> ref = ciudadDistanciaDO.getCiudadDerId();

		// ----------------------------------------
		// If ident == 0 there is nothing to do
		// ----------------------------------------

		if (ref.getRefIdent() == 0) {
			return;
		}

		CiudadDO ciudadDO = //
		(CiudadDO) ciudadDAO.loadById(ref.getRefIdent());

		ref.setRefValue(ciudadDO);
	}

	public List<ICiudadDistanciaDO> listByCiudadDerId(int id)
			throws SQLException {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(CiudadDistanciaDO.CIUDAD_DER_ID);
		strbuf.append(" = ");
		strbuf.append(id);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<ICiudadDistanciaDO> ret = new ArrayList<ICiudadDistanciaDO>();

		while (rs.next()) {
			ret.add(resultSetToDO(rs));
		}

		return ret;
	}

	public List<ICiudadDistanciaDO> listByCiudadIzqId(int id)
			throws SQLException {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(CiudadDistanciaDO.CIUDAD_IZQ_ID);
		strbuf.append(" = ");
		strbuf.append(id);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<ICiudadDistanciaDO> ret = new ArrayList<ICiudadDistanciaDO>();

		while (rs.next()) {
			ret.add(resultSetToDO(rs));
		}

		return ret;
	}

}
